﻿using System;
using Sinacor.Infra.Service.Security.Services;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using System.Collections.Generic;
using System.ComponentModel;

namespace Sinacor.Servico.Bovespa.Ordens.Service.ServiceImplementation
{
    /// <summary>
    /// ServiceImplementation Class - AjusteMercadoFuturo
    /// </summary>
    [SinacorServiceBehavior]
    public class AjusteMercadoFuturo : ServiceContract.IAjusteMercadoFuturo
    {
        #region IAjusteMercadoFuturo Membros

        /// <summary>
        /// Calcula ajuste de posição de mercado futuro
        /// </summary>
        /// <param name="request">Contrato de dados contendo a data do pregão</param>
        public void AjustarPosicao(Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.DataPregaoRequest request)
        {
            BusinessLogic.AjusteMercadoFuturo ajusteMercadoFuturo = new BusinessLogic.AjusteMercadoFuturo();
            ajusteMercadoFuturo.AjustarPosicao(request.Valor);
        }

        /// <summary>
        /// Altera um registro de ajuste de mercado futuro
        /// </summary>
        /// <param name="request">Contrato de dados contendo os valores a serem alterados</param>
        public void AlterarAjusteMercadoFuturo(Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.AjusteMercadoFuturoRequest request)
        {
            Translator.DataContractToBusinessEntity.AjusteMercadoFuturo translator = new Translator.DataContractToBusinessEntity.AjusteMercadoFuturo();
            BusinessLogic.AjusteMercadoFuturo ajusteMercadoFuturo = new BusinessLogic.AjusteMercadoFuturo();
            ajusteMercadoFuturo.AlterarAjusteMercadoFuturo(translator.ToAjusteMercadoFuturo(request));
        }

        /// <summary>
        /// Consulta registros de ajustes de mercado futuro
        /// </summary>
        /// <param name="request">Contrato de dados contendo o código do negócio(opcional) e a data do pregão</param>
        /// <returns>Lista de contratos de dados de ajustes de mercado futuro</returns>
        public List<Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Response.AjusteMercadoFuturoResponse> ConsultarAjustesMercadoFuturo(Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.FiltroAjusteMercadoFuturoRequest request)
        {
            Translator.DataContractToBusinessEntity.AjusteMercadoFuturo translatorToBusinessEntity = new Translator.DataContractToBusinessEntity.AjusteMercadoFuturo();
            BusinessLogic.AjusteMercadoFuturo ajusteMercadoFuturo = new BusinessLogic.AjusteMercadoFuturo();
            List<BusinessEntity.AjusteMercadoFuturo> listaAjusteMercadoFuturo = ajusteMercadoFuturo.ConsultarAjustesMercadoFuturo(translatorToBusinessEntity.ToFiltroAjusteMercadoFuturo(request));
            Translator.BusinessEntityToDataContract.AjusteMercadoFuturo translatorToDataContract = new Translator.BusinessEntityToDataContract.AjusteMercadoFuturo();
            return translatorToDataContract.ToAjusteMercadoFuturoResponse(listaAjusteMercadoFuturo);
        }

        /// <summary>
        /// Exclui um registro de ajuste de mercado futuro
        /// </summary>
        /// <param name="request">Contrato de dados(filtro) contendo o código do negócio, data do pregão e o ano do pregão</param>
        public void ExcluirAjusteMercadoFuturo(Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.FiltroAjusteMercadoFuturoRequest request)
        {
            Translator.DataContractToBusinessEntity.AjusteMercadoFuturo translatorToBusinessEntity = new Translator.DataContractToBusinessEntity.AjusteMercadoFuturo();
            BusinessLogic.AjusteMercadoFuturo ajusteMercadoFuturo = new BusinessLogic.AjusteMercadoFuturo();
            ajusteMercadoFuturo.ExcluirAjusteMercadoFuturo(translatorToBusinessEntity.ToFiltroAjusteMercadoFuturo(request));
        }

        /// <summary>
        /// Executa as transações de Inserção, Exclusão e Alteração de registros de ajuste de mercado futuro
        /// </summary>
        /// <param name="listaInclusao">Lista de contratos de dados para inclusão</param>
        /// <param name="listaAlteracao">Lista de contratos de dados para alteração</param>
        /// <param name="listaExclusao">Lista de contratos de dados para exclusão</param>
        public void ExecutarTransacoes(List<Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.AjusteMercadoFuturoRequest> listaInclusao, List<Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.AjusteMercadoFuturoRequest> listaAlteracao, List<Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.FiltroAjusteMercadoFuturoRequest> listaExclusao)
        {
            Translator.DataContractToBusinessEntity.AjusteMercadoFuturo translatorToBusinessEntity = new Translator.DataContractToBusinessEntity.AjusteMercadoFuturo();
            BusinessLogic.AjusteMercadoFuturo ajusteMercadoFuturo = new BusinessLogic.AjusteMercadoFuturo();
            ajusteMercadoFuturo.ExecutarTransacoes(translatorToBusinessEntity.ToAjusteMercadoFuturo(listaInclusao),
                                                    translatorToBusinessEntity.ToAjusteMercadoFuturo(listaAlteracao),
                                                    translatorToBusinessEntity.ToFiltroAjusteMercadoFuturo(listaExclusao));
        }

        /// <summary>
        /// Inclui um registro de ajuste de mercado futuro
        /// </summary>
        /// <param name="request">Contrato de dados de ajuste de mercado futuro</param>
        public void IncluirAjusteMercadoFuturo(Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request.AjusteMercadoFuturoRequest request)
        {
            Translator.DataContractToBusinessEntity.AjusteMercadoFuturo translatorToBusinessEntity = new Translator.DataContractToBusinessEntity.AjusteMercadoFuturo();
            BusinessLogic.AjusteMercadoFuturo ajusteMercadoFuturo = new BusinessLogic.AjusteMercadoFuturo();
            ajusteMercadoFuturo.IncluirAjusteMercadoFuturo(translatorToBusinessEntity.ToAjusteMercadoFuturo(request));
        }

        #endregion
    }
}